package test.test_6_28;
/*
父类Person
     属性：String name，int age
     行为：eat();
 子类SouthPerson
     属性：String name，int age，double salary
     行为：eat()，swim()
 子类NorthPerson
     属性：String name，int age，double height
     行为：eat()，drink()
 写代码实现，eat()方法的多态效果
     1，人都要吃饭
     2，南方人喜欢吃米饭
     3，北方人喜欢吃面食
 */
public class Person {
    String name;
    int age;
    public void eat() {//被static或者final修饰的方法无法被继承
        System.out.println("人吃饭");
    }
}
class SouthPerson extends Person {
    String name;
    int age;
    double salary;
    @Override
    public void eat() {
        System.out.println("南方人吃米饭...");
    }
    public void swim() {
        System.out.println("南方人喜欢游泳...");
    }


}
class NorthPerson extends Person {
    String name;
    int age;
    double height;
    @Override
    public void eat() {
        System.out.println("北方人吃面条...");
    }

    public void drink() {
        System.out.println("北方人喜欢喝酒...");
    }
}
class Test {
    public void testPerson(Person person) {
        person.eat();
    }
    /*1，编写测试方法，
    要求该方法允许传入SouthPerson对象和NorthPerson对象，并在方法体中调用它们的eat()方法
    方法调用的结果一致吗？
     2，用父类引用指向子类对象的方式创建SouthPerson对象，能否直接访问salary属性和swim()方法？
    如果不能，应该怎么写代码让它能够正常调用？
     3，用父类引用指向子类对象的方式创建NorthPerson对象，能否（直接或写代码）访问salary属性和swim()方法？
    如果不能，将该对象引用强转为SouthPerson引用，能否成功？为什么？*/

    public static void main(String[] args) {
        //第一题答案:调用的方法不一致，父类引用指向子类对象，调用成员方法时，编译看左边，运行看右边
        Test test = new Test();
        test.testPerson(new SouthPerson());
        test.testPerson(new NorthPerson());

        //第二题答案
        Person person = new SouthPerson();
        //person.swim();
        //double salary = person.salary;用父类的引用指向子类对象的方式，不能直接访问salary属性和swim()方法

        //正确的调用方式如下：
        if(person instanceof SouthPerson) {
            SouthPerson southPerson = ((SouthPerson) person);
            System.out.println(southPerson.salary);
            southPerson.swim();
        }

        //第三题答案：
        //引用类型转换分为：强制类型转换    自动类型转换
        //在强制类型转换种，两个类之间必须有继承的关系也就是子类和父类
        //用Person person = new NorthPerson();父类引用指向子类对象
        //能够访问NorthPerson()不能访问salary属性和swim()方法，因为这是不同类且没有继承关系的SouthPerson()的属性
        //本质相当于用SouthPerson的引用指向NorthPerson的对象 两者没有继承关系无法这样做
        Person person1 = new NorthPerson();
        SouthPerson southPerson = ((SouthPerson) person1);
        //southPerson.salary;
        //southPerson.swim();
        //person1.salary;
        //person1.swim();

        System.out.println(person1 instanceof SouthPerson);//false
    }


}
